package domain.controllers;

import domain.Entity.EntityTareaTrabajada;
import domain.Entity.EntityTrabajador;
import domain.Informe.Informe;
import domain.Informe.InformeCreado;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import org.springframework.web.servlet.view.RedirectView;

/**
 *
 * @author jorge
 */
public class informeController implements Controller{
    
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        
        ModelAndView mav = new ModelAndView();
        HttpSession session = request.getSession();
       
        SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
        InformeCreado infcre = null;
        Informe informe = new Informe();
        String guardado = request.getParameter("guardado");
        if(guardado == null){
            session.setAttribute("guardado", null);
        }else{
            session.setAttribute("guardado", guardado);
        }
        String tipo = request.getParameter("tipo");
        informe.setTipo(tipo);
        String subtipo =request.getParameter("subtipo");
        List resultado = new ArrayList();
        String url ="informeController.htm?";
        
        long identificador = 0;
        if(tipo.equals("proyecto")){
                     
                    identificador = Integer.parseInt(request.getParameter("proyecto"));
            
        }else if(tipo.equals("trabajador")){
                EntityTrabajador trabajador = (EntityTrabajador) session.getAttribute("trabajadorUsuario");  
                if(trabajador == null){
                    identificador = Integer.parseInt(request.getParameter("trabajador"));
                    session.setAttribute("trabajadorInforme", request.getParameter("trabajador"));
                }else{
                    identificador = trabajador.getDni();
                    session.setAttribute("trabajadorInforme", trabajador.getDni().toString() );
                }
        }
                 
        
        if(tipo.equals("tarea")){
            subtipo = "fechas";
            informe.setSubTipo(subtipo);
            String fechaIni =request.getParameter("fechaIni");
            String fechaFin =request.getParameter("fechaFin");
            Pattern p = Pattern.compile("[a-zA-Z]");
            Matcher m1 = p.matcher(fechaIni);
            Matcher m2 = p.matcher(fechaFin);
            if(fechaIni.equals("") || fechaFin.equals("") || m1.find() || m2.find() || fechaIni.length() !=10 || fechaFin.length() !=10){
                     mav.setView(new RedirectView("error.htm"));
                     return mav;
            }
            Date fecIni = sdf.parse(fechaIni);
            Date fecFin = sdf.parse(fechaFin);
            session.setAttribute("fechaIniInforme",fechaIni );
            session.setAttribute("fechaFinInforme",fechaFin );
            infcre = informe.crearInforme();
            identificador = Integer.parseInt(request.getParameter("tarea"));
            resultado = infcre.crearInformeFechas(fecIni, fecFin, identificador);
            url= url.concat("tipo="+tipo+"&subtipo=fechas&fechaIni="+fechaIni+"&fechaFin="+fechaFin+"&tarea="+identificador);
            session.setAttribute("urlinforme", url);
        }else{
            informe.setSubTipo(subtipo);            
            if(subtipo.equals("fechas")){
                 
                String fechaIni =request.getParameter("fechaIni");
                String fechaFin =request.getParameter("fechaFin");
                Pattern p = Pattern.compile("[a-zA-Z]");
                Matcher m1 = p.matcher(fechaIni);
                Matcher m2 = p.matcher(fechaFin);
                if(fechaIni.equals("") || fechaFin.equals("") || m1.find() || m2.find() || fechaIni.length() !=10 || fechaFin.length() !=10){
                     mav.setView(new RedirectView("error.htm"));
                     return mav;
                }
                Date fecIni = sdf.parse(fechaIni);
                Date fecFin = sdf.parse(fechaFin);
                session.setAttribute("fechaIniInforme",fechaIni );
                session.setAttribute("fechaFinInforme",fechaFin );
                infcre = informe.crearInforme();
                resultado = infcre.crearInformeFechas(fecIni, fecFin, identificador);
                 if(tipo.equals("proyecto")){
                    
                     url= url.concat("tipo="+tipo+"&subtipo="+subtipo+"&fechaIni="+fechaIni+"&fechaFin="+fechaFin+"&proyecto="+identificador);
                     session.setAttribute("urlinforme", url);
                 
                 }else{
                     
                     url= url.concat("tipo="+tipo+"&subtipo="+subtipo+"&fechaIni="+fechaIni+"&fechaFin="+fechaFin+"&trabajador="+identificador);
                      session.setAttribute("urlinforme", url);
                 }
            }else if(subtipo.equals("trabajador")){
                 
                 infcre = informe.crearInforme();
                 long dni = Integer.parseInt(request.getParameter("trabajadorGestor"));
                 session.setAttribute("dniTrabajadorGestor", request.getParameter("trabajadorGestor"));
                 resultado = infcre.creaInformeTrabajador(identificador, dni);
                 url= url.concat("tipo="+tipo+"&subtipo="+subtipo+"&proyecto="+identificador+"&trabajadorGestor="+dni);
                 session.setAttribute("urlinforme", url); 
                 
            }else if(subtipo.equals("etiqueta")){
                 
                 infcre = informe.crearInforme();
                 String etiqueta = request.getParameter("etiqueta");
                 session.setAttribute("etiquetaInforme", etiqueta);
                 resultado = infcre.crearInformeEtiqueta(etiqueta, identificador);
                  if(tipo.equals("proyecto")){
                    
                     url= url.concat("tipo="+tipo+"&subtipo="+subtipo+"&proyecto="+identificador);
                     session.setAttribute("urlinforme", url);
                 
                 }else{
                     
                     url= url.concat("tipo="+tipo+"&subtipo="+subtipo+"&trabajador="+identificador);
                      session.setAttribute("urlinforme", url);
                 }
                   
                
            }else{
                infcre = informe.crearInforme();
                resultado = infcre.creaInforme(identificador);
                if(tipo.equals("proyecto")){
                     url= url.concat("tipo="+tipo+"&subtipo="+subtipo+"&proyecto="+identificador);
                      session.setAttribute("urlinforme", url);
                }else{
                    url= url.concat("tipo="+tipo+"&subtipo="+subtipo+"&trabajador="+identificador);
                     session.setAttribute("urlinforme", url);
                }    
            }
        }
        
        session.setAttribute("tipo", tipo);
        session.setAttribute("subtipo", subtipo);
        session.setAttribute("informe", resultado);
        int horas = 0;
        int minutos=0;
        Iterator it = resultado.iterator();
        while(it.hasNext()){
            EntityTareaTrabajada ett = (EntityTareaTrabajada) it.next();
            horas = horas + ett.getTiempo().getHours();
            minutos = minutos +ett.getTiempo().getMinutes();
            if(minutos >= 60){
                horas = horas +1 ;
                minutos = minutos -60 ;
            }
        }
        session.setAttribute("horasInforme", horas);
        session.setAttribute("minutosInforme", minutos);
        mav.setView(new RedirectView("mostrarInforme.htm"));
        
        return mav;
        
    }
        
    }

